#include "command.h"
string get_name(string args,string type);
string get_db_name(string args){
    return get_name(args,"database");
}
string get_table_name(string args){
    return get_name(args,"table");
 }
string get_name(string args,string type){
    // 初始化数据库名称变量
    string token;
    // 定义缓冲区用于存储解析出的数据库名称
    char buf[1024];
    // type: database table之类的
    string type_mask = type+" %s";
    // 解析
    if(sscanf(args.c_str(),type_mask.c_str(),buf)!=1){
        error("create database error");
        /*错误处理*/
        return "";
    }
    // 将解析出的数据库名称赋值给token变量
    token = buf;
    return token;
}
 
 
 void create_db(string args) {
    string token = get_db_name(args);
    // 创建一个新的数据库对象
    db  db_;
    // 设置数据库对象的名称
    db_.name = token;
    // 初始化数据库对象的表列表为空
    db_.tables={};
    database.push_back(db_);
}
/**
 * 删除数据库
 * 
 * 该函数根据提供的参数获取数据库名称，并从全局数据库列表中删除该数据库
 * 如果数据库不存在，则输出错误信息
 * 
 * @param args 包含数据库名称的字符串参数
 */
void drop_db(string args) {
    // 从参数中获取数据库名称
    string token = get_db_name(args);
    
    // 遍历全局数据库列表，寻找匹配的数据库名称
    for(int i=0;i < static_cast<int>(database.size());i++){
        // 如果找到匹配的数据库，从列表中擦除并返回
        if(database[i].name==token){
            database.erase(database.begin()+i);
            return;
        }
    }
    
    // 如果未找到匹配的数据库，输出错误信息
    error("drop database error,no such database %s\n",token.c_str());
}

/**
 * 使用数据库
 * 
 * 该函数根据提供的参数获取数据库名称，并设置当前正在使用的数据库
 * 如果数据库不存在，则输出错误信息
 * 
 * @param args 包含数据库名称的字符串参数
 * @param current_db 引用类型，用于存储当前正在使用的数据库
 */
void use_db(string args,db &current_db){
    // 遍历全局数据库列表，寻找匹配的数据库名称
    for(auto db_:database){
        // 如果找到匹配的数据库，将其设置为当前正在使用的数据库并返回
        if(db_.name==args){
            current_db = db_;
            return;
        }
    }
    
    // 如果未找到匹配的数据库，输出错误信息
    error("use database error,no such database %s\n",args.c_str());
}
void create_table(string args,db current_db){
/*语法create table xxx (col_type col_name1, col_type col_name2, … );*/
    string table_name = get_table_name(args);
    args=args.substr(table_name.size()+6);
    /*create_table_helper函数实现在flex（create_table.l）
    声明在command_uitls.h中 */
    map<string,string> column_type_name = create_table_helper(args);
    table t;
    t.name = table_name;
    for(auto i:column_type_name){
        column c;
        c.type = i.first;
        c.name = i.second;
        t.columns.push_back(c);
    }
    current_db.tables.push_back(t);
}
